package ssm.ann.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Spring 默认提供了一些 Controller 接口的实现类以方便我们直接使用
 * AbstractController 它对某些请求方式做了些特殊处理，提高了效率
 * <p>
 * ServletWrappingController 则是将当前应用中的某个 Servlet 直接包装为一个Controller，
 * 所有到 ServletWrappingController 的请求实际上是由它内部所包装的这个 Servlet 来处理的。
 * 它内部包装了 servlet，对外并不公开，相当于屏蔽了 servlet 的效果。
 * <p>
 * ServletForwardingController：servlet 转发控制器，将拦截的请求交由某个 servlet 来处理。
 * 和 ServletWrappingController 类似，它也是一个 Servlet 相关的 controller，他们都实现将 HTTP 请求适配到一个已存的 Servlet 实现。
 * 它和请求包含和请求转发有关：
 * rd.include(request, response);
 * rd.forward(request, response);
 * <p>
 * ParameterizableViewController
 * 可参数化视图控制器(ParameterizableViewController)，可参数化视图控制器只是简单的返回配置的视图名。
 * 这个 controller 可以选择直接将一个 request 请求到 JSP 页面。这样做的好处就是不用向客户端暴露具体的视图技术而只是给出了
 * 具体的 controller URL，而具体的视图则由视图解析器来决定
 * 像这种实现类，一般都是运用在基于XML的配置上（当然你也可以使用@Bean配置）
 * <p>
 * UrlFilenameViewController
 * 使用该控制器与 ParameterizableViewController 控制器相比可以省去实视图名的配置，直接通过 url 解析
 * 例如访问的是 login.do，那么视图名就是 login。经常把它配置为默认的 Handler
 */
@Controller("/hello") // 必须要以 / 开头，表示使用 BeanNameURLHandlerMapping 的方式处理
public class My_02_AbstractController extends AbstractController {
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("this my demo controller");
        response.getWriter().write("this my demo controller from body");
        return null; // 实现类似 @ResponseBody 的功能，返回 null 告诉视图渲染，直接把 body 里面的内容输出浏览器即可
    }
}
